Czym jest Stos

VB jest takim środowiskiem programowania, które umożliwia tworzenia różnorodnych udogodnień pisania programu. Możemy między innymi tworzyć własne typy danych. Jest to jednak ograniczone do pisania tylko danych strukturalnych, tzn. takich, które mają podwartości. Takie typy danych piszemy zastosowując Type, np.:

Type Punkt
   
x As Long
   
y As Long
End Type


Taki kod ma odpowiednik w składni języka C++:

typedef struct{
long x;
long y;
} Punkt;

Jak widzimy typedef jest odpowiednikiem Type, ale nie do końca, bo typedef pozwala również na tworzenie typów danych nie strukturalnych, np:

typedef long zmienna;

A w tym przypadku nie ma odpowiednika w składni VB. Programiści C++ uważają za jeszcze jeden plus właśnie to, że mają tyle typów danych, ale są to tylko pseudo typy, które da się zastąpić innymi, np. HWND to long.

W C++ jest jeszcze jeden typ danych, których w VB nie ma, a przydałyby się. Ten typ danych to stos. W prawdzie istnieje typ danych który jest podobny do stosu (kolekcja), ale nie ma on przygotowanych funkcji obsługi.

Do czego służy Stos?
Do stosu możemy załadować dowolną liczbę wartości. Są one wrzucane "na stos" i potem możemy je wydobywać, ale w odwrotnej kolejności. Można to właśnie porównać ze stosem książek - układamy stos ok. 10 książek, a potem czytając je bierzemy jedną z góry, potem następną... Istnieje także możliwość wybrania elementu stosu z dowolnego miejsca, reakcja stosu jest w tedy taka sama jak reakcja książek, wszystkie powyżej wybranej spadają o jedną niżej.

Praktyczne zastosowanie Sotsu
Właściwie, to zastosowanie stosu w VB nie jest aż tak potrzebne. Ale możemy np. ładować do stosu listę plików które mają być kopiowane lub otwierane (lub kasowane itp.). Możemy także dynamicznie ładować do stosu procedury (a raczej ich adresy, i potem je wywoływać tworząc  wątek). Ale po co?

Tworzymy obsługę stosu
Do modułu wklejamy poniższy kod:

Type Stack
Data As New Collection
End Type

Sub
Push(clStack As Stack, anData)
'dodaje dane do stosu
clStack.Data.Add anData
End Sub

Function
StackIsEmpty(clStack As Stack) As Boolean
'zwraca True jeśli stos jest pusty
Dim
Leght As Long
Leght = clStack.Data.Count
If
Leght = 0 Then StackIsEmpty = True
End Function

Function
Pop(clStack As Stack) As Variant
'wyciąga (od góry) dane ze stosu
Dim
lIdx As Long
lIdx = clStack.Data.Count
If
lIdx > 0 Then
Pop = clStack.Data.Item(lIdx)
clStack.Data.Remove lIdx
Else
Err.Raise
13579, "VBStack.Pop", "Stack is empty."
End If
End Function

Function
GetIDFormStack(clStack As Stack, lngElement As Long) As Variant
'wyciąga element stosu
Dim
lIdx As Long
lIdx = lngElement
If
lIdx > 0 Then
GetIDFormStack = clStack.Data.Item(lIdx)
clStack.Data.Remove lIdx
Else
Err.Raise
13579, "VBStack.GetIDFromStack", "Stack is empty."
End If
End Function


Jak korzystać?
Dim'ujemy stos (Stack), a potem używamy komendy Push(stos, dane do wrzucenia), aby opróżniać stos stosujemy Pop(stos), a aby wyciągnąć dowolną część stosu - GetIDFromStack(Stos, Element).

Jeżeli ktoś z was znalazł jakieś praktyczne zastosowanie stosu, to chętnie posłucham.
Prezentowane procedury i funkcje to przerobione i ulepszone składniki VBFAQ.

Marcin Porębski ( Doogie )

marcin.porebski@interia.pl